/**
 * 分页信息实体类
 * 用于封装分页查询结果，符合项目分页响应格式规范
 * 
 * @param <T> 分页数据列表的元素类型
 * @author 系统生成
 */
package com.example.model.common;

import lombok.Data;
import java.util.List;

/**
 * 分页信息实体类
 * 封装分页查询的结果数据，遵循项目响应格式规范
 * 
 * @param <T> 分页数据列表的元素类型
 */
@Data
public class PageInfo<T> {
    
    /**
     * 当前页码，从1开始计数
     */
    private Integer current;
    
    /**
     * 每页显示的记录数
     */
    private Integer pageSize;
    
    /**
     * 总记录数
     */
    private Long total;
    
    /**
     * 总页数
     */
    private Integer pages;
    
    /**
     * 当前页的数据列表
     */
    private List<T> records;
    
    /**
     * 无参构造方法，符合JavaBean规范
     */
    public PageInfo() {
    }
    
    /**
     * 构造方法，初始化分页参数
     * 
     * @param current 当前页码
     * @param pageSize 每页大小
     * @param total 总记录数
     * @param records 数据列表
     */
    public PageInfo(Integer current, Integer pageSize, Long total, List<T> records) {
        this.current = current;
        this.pageSize = pageSize;
        this.total = total;
        this.records = records;
        // 计算总页数
        this.pages = calculatePages(total, pageSize);
    }
    
    /**
     * 构造方法，初始化所有参数
     * 
     * @param current 当前页码
     * @param pageSize 每页大小
     * @param total 总记录数
     * @param pages 总页数
     * @param records 数据列表
     */
    public PageInfo(Integer current, Integer pageSize, Long total, Integer pages, List<T> records) {
        this.current = current;
        this.pageSize = pageSize;
        this.total = total;
        this.pages = pages;
        this.records = records;
    }
    
    /**
     * 计算总页数
     * 
     * @param total 总记录数
     * @param pageSize 每页大小
     * @return 总页数
     */
    private Integer calculatePages(Long total, Integer pageSize) {
        if (total == null || total < 0 || pageSize == null || pageSize <= 0) {
            return 0;
        }
        return (int) Math.ceil((double) total / pageSize);
    }
    
    /**
     * 设置每页大小，自动重新计算总页数
     * 
     * @param pageSize 每页大小
     */
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
        // 重新计算总页数
        if (this.total != null) {
            this.pages = calculatePages(this.total, pageSize);
        }
    }
    
    /**
     * 设置总记录数，自动重新计算总页数
     * 
     * @param total 总记录数
     */
    public void setTotal(Long total) {
        this.total = total;
        // 重新计算总页数
        if (this.pageSize != null) {
            this.pages = calculatePages(total, this.pageSize);
        }
    }
    
    /**
     * 判断是否有下一页
     * 
     * @return 是否有下一页
     */
    public boolean hasNextPage() {
        return this.current != null && this.pages != null && this.current < this.pages;
    }
    
    /**
     * 判断是否有上一页
     * 
     * @return 是否有上一页
     */
    public boolean hasPreviousPage() {
        return this.current != null && this.current > 1;
    }
    
    /**
     * 获取下一页页码
     * 
     * @return 下一页页码
     */
    public Integer getNextPage() {
        if (hasNextPage()) {
            return this.current + 1;
        }
        return this.current;
    }
    
    /**
     * 获取上一页页码
     * 
     * @return 上一页页码
     */
    public Integer getPreviousPage() {
        if (hasPreviousPage()) {
            return this.current - 1;
        }
        return this.current;
    }
}